package example;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;

/**
 * CountDownLatch 是 Java 中的一个同步工具，它允许一个或多个线程等待一组事件的发生，直到所有事件都发生之后才能继续执行。
 * @author dengzhiyuan
 * @version 1.0
 * @describe
 * @time 2023/3/19 21:59
 */
public class CountDownLatchExample {

//    CountDownLatch(int count): 创建一个 CountDownLatch 对象，需要指定事件数量。
//
//    void await() throws InterruptedException: 调用该方法的线程会等待事件发生，
//    直到所有事件都发生之后才能继续执行。如果在等待过程中发生了中断，则会抛出 InterruptedException 异常。
//
//    boolean await(long timeout, TimeUnit unit) throws InterruptedException:
//    调用该方法的线程会等待事件发生，但是如果等待时间超过了指定的 timeout，则会返回 false，表示等待超时。如果在等待过程中发生了中断，则会抛出 InterruptedException 异常。
//
//    void countDown(): 表示一个事件已经发生，事件数量减一。当事件数量减为 0 时，await 方法会返回。
//
//    long getCount(): 返回当前事件数量。
//
//    这些方法可以帮助我们实现复杂的多线程协调和同步逻辑。需要注意的是，CountDownLatch 是一次性的，也就是说
//    ，一旦所有事件都发生了，它就不能被重复使用。如果需要多次等待事件发生，可以考虑使用 CyclicBarrier 类。

    public static final int THREAD_COUNT = 3;

    public static void main(String[] args) throws InterruptedException {

        CountDownLatch count = new CountDownLatch(THREAD_COUNT);

        IntStream.range(0, THREAD_COUNT).forEach(i -> new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(Thread.currentThread().getName() + ":开始执行");
            count.countDown();
        },"线程"+i).start());

        count.await();

        System.out.println(Thread.currentThread().getName()+":总线程执行结束");
    }



}
